#include <iostream>
#include <string>

using namespace std;

// auto_ptr思想是：管理权的转移。也就是当发现有一个auto_ptr对象a1赋值给
// 另一个对象a2或者拷贝构造a2，那么a1获得的资源就交给a2，
// a2来管理a1指向的那块空间，a1就指向NULL,这样就保证了
// 每块空间只有一个auto_ptr对象指向它，就不会有空间被释放多次的问题。

template<class T>
class Auto_Ptr
{
    protected:
        T* _ptr;
    public:
        Auto_Ptr(T * ptr):_ptr(ptr){}
        ~Auto_Ptr()
        {
            if(_ptr != NULL)
            {
                delete _ptr;
                printf("OX%p\n",_ptr);
            }
        }
        //像指针一样 
        T& operator*()
        {
            return * _ptr;
        }

        T* operator->()
        {
            return _ptr;
        }

        Auto_Ptr(Auto_Ptr<T> & ap):_ptr(ap._ptr)
        {
            ap._ptr = NULL;
        }
        Auto_Ptr<T> & operator=(Auto_Ptr<T> & ap)
        {
            if(this !=&ap)
            {
                delete _ptr;
                _ptr = ap._ptr;
                ap._ptr = NULL;
            }
            return *this;
        }
};
int main()
{
    Auto_Ptr<int> p1(new int(5));
    Auto_Ptr<int> p2(p1);
    cout<<*p2<<endl;
    cout<<*p1<<endl;
    return 0;
}